package com.yjz.jvm.反射;

import org.springframework.core.GenericTypeResolver;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @Desc  这里面的东西主要讲的是如何获取T 的Class 类型(俗称：类类型)
 * @Author: jinzhong.yuan
 * @Date: 2019/2/21 17:12
 */
public abstract class SuperClass<T> {
  private Class<T> beanClass;

  /** ParameterizedType 参数化类型详解
   * https://blog.csdn.net/datouniao1/article/details/53788018
   * https://www.cnblogs.com/Meiwah/p/10434893.html
   */


  @SuppressWarnings("unchecked")
  public SuperClass() {
    /**
     * 子类在执行自己的构造方法的时候,也会执行父类的构造方法
     * 下行代码中的this指的是子类的对象
     */
      // 实现1 使用jdk提供的工具类
      ParameterizedType parameterizedType = (ParameterizedType)this.getClass() .getGenericSuperclass();
      Type[] types = parameterizedType.getActualTypeArguments();
      beanClass = (Class<T>) types[0];

      //实现2  使用spring提供的工具类
      beanClass=   (Class<T>)GenericTypeResolver.resolveTypeArgument(this.getClass(),SuperClass.class);

  }

  public Class<T> getBeanClass() {
    return beanClass;
  }

  public void setBeanClass(Class<T> beanClass) {
    this.beanClass = beanClass;
  }

  public static void main(String[] args) {
    SuperClass<Cat> superClass = new SubClass();
    System.out.println(superClass.getBeanClass());
    //看到运行结果你可能就清楚了，就是获取实际的泛型类。
  }
}
